package chaoyue.study.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 线程创建方式
 * 可以看到，线程都是要包在Thread对象里进行
 */
public class ThreadCreate {
    public static void main(String[] args) throws Exception{
        // 方式1 使用继承的方式创建线程
        MyThread t1 = new MyThread();// 子类继承了Thread，相当于直接通过创建Thread对象
        t1.start();

        // 方式2 使用Runnable接口创建线程
        Runnable r = () -> System.out.println("thread create runnable " + Thread.currentThread().getName());
        Thread t2 = new Thread(r);// 通过Runnable来创建Thread对象，即通过Runnable来指定Thread中的run方法
        t2.start();

        // 方式3 使用Callable + FutureTask（处理有返回值的场景）
        Callable<Integer> c = () -> {
            System.out.println("thread create callable " + Thread.currentThread().getName());
            return 233;
        }; //Callable有返回值且可以抛出异常
        FutureTask<Integer> f = new FutureTask<>(c);//需要通过FutureTask来获取返回值和接收异常
        Thread t3 = new Thread(f);//通过FutureTask来构建Thread对象
        t3.start();
        System.out.println("t3 result: " + f.get());
    }

    private static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("thread create extends " + Thread.currentThread().getName());
        }
    }
}
